import React, { useState, useRef, useEffect, useCallback } from "react";
import { Button, Avatar, Badge, Upload, message, Input, Alert, Modal, Spin, Typography } from "antd";
import {
  MessageOutlined,
  MinusOutlined,
  CloseOutlined,
  SendOutlined,
  PaperClipOutlined,
  FileImageOutlined,
  ThunderboltOutlined,
  LoadingOutlined,
  DragOutlined,
  ExpandOutlined,
  CompressOutlined,
  UploadOutlined,
  StopOutlined,
  ExclamationCircleOutlined,
  BookOutlined,
  BarChartOutlined,
  UserOutlined,
  SettingOutlined,
  TrophyOutlined,
  TeamOutlined,
} from "@ant-design/icons";
import type { UploadFile, UploadProps } from "antd";
import { authAPI } from "../../services/api";
import { useExamMode } from "../../hooks/useExamMode";
import { useUser } from "../../contexts/UserContext";
import "./DigitalAssistant.scss";

const { TextArea } = Input;

interface ChatMessage {
  id: string;
  role: "user" | "assistant";
  content: string;
  timestamp: number;
  isStreaming?: boolean;
  files?: UploadFile[]; // 添加文件信息
}

interface Position {
  x: number;
  y: number;
}

interface Size {
  width: number;
  height: number;
}

interface DigitalAssistantProps {
  className?: string;
  disabled?: boolean;
}

interface AIModalProps {
  visible: boolean;
  title: string;
  content: string;
  loading: boolean;
  onClose: () => void;
  onRegenerate: () => void;
}

const DigitalAssistant: React.FC<DigitalAssistantProps> = ({
  className,
  disabled = false,
}) => {
  const [isVisible, setIsVisible] = useState(true);
  const [isMinimized, setIsMinimized] = useState(false);
  const [isTyping, setIsTyping] = useState(false);
  const [currentMessage, setCurrentMessage] = useState("");
  const [messages, setMessages] = useState<ChatMessage[]>([]);
  const [unreadCount, setUnreadCount] = useState(0);
  const [uploadFiles, setUploadFiles] = useState<UploadFile[]>([]);
  const [canStopResponse, setCanStopResponse] = useState(false); // 是否可以停止回复
  
  // AI模态框状态
  const [aiModalVisible, setAiModalVisible] = useState(false);
  const [aiModalTitle, setAiModalTitle] = useState("");
  const [aiModalContent, setAiModalContent] = useState("");
  const [aiModalLoading, setAiModalLoading] = useState(false);
  const [currentAIAction, setCurrentAIAction] = useState<string>("");

  // 优化的拖拽状态
  const [position, setPosition] = useState<Position>({ x: 20, y: 20 });
  const [size, setSize] = useState<Size>({ width: 380, height: 600 });
  const [isDragging, setIsDragging] = useState(false);
  const [isMaximized, setIsMaximized] = useState(false);
  const [dragOffset, setDragOffset] = useState<Position>({ x: 0, y: 0 });

  const messagesContainerRef = useRef<HTMLDivElement>(null);
  const messageInputRef = useRef<HTMLTextAreaElement>(null);
  const chatContainerRef = useRef<HTMLDivElement>(null);
  const abortControllerRef = useRef<AbortController | null>(null);

  // 使用考试模式检测hook
  const { isExamMode } = useExamMode();
  const shouldDisable = disabled || isExamMode;
  
  // 获取用户信息
  const { user } = useUser();
  
  // 获取用户角色
  const userRole = user?.role || "student";

  // 优化的拖拽处理
  const handleMouseDown = useCallback(
    (e: React.MouseEvent) => {
      if (isMaximized) return; // 最大化时禁止拖拽

      const target = e.target as HTMLElement;
      if (
        target.closest(".drag-handle") ||
        target.classList.contains("drag-handle")
      ) {
        e.preventDefault();
        setIsDragging(true);

        const rect = chatContainerRef.current?.getBoundingClientRect();
        if (rect) {
          setDragOffset({
            x: e.clientX - rect.left,
            y: e.clientY - rect.top,
          });
        }
      }
    },
    [isMaximized]
  );

  const handleMouseMove = useCallback(
    (e: MouseEvent) => {
      if (!isDragging) return;

      e.preventDefault();
      const newX = e.clientX - dragOffset.x;
      const newY = e.clientY - dragOffset.y;

      // 边界限制，增加一些缓冲
      const maxX = window.innerWidth - size.width;
      const maxY = window.innerHeight - size.height;

      setPosition({
        x: Math.max(0, Math.min(newX, maxX)),
        y: Math.max(0, Math.min(newY, maxY)),
      });
    },
    [isDragging, dragOffset, size]
  );

  const handleMouseUp = useCallback(() => {
    if (isDragging) {
      setIsDragging(false);
    }
  }, [isDragging]);

  // 添加和移除事件监听器
  useEffect(() => {
    if (isDragging) {
      document.addEventListener("mousemove", handleMouseMove, {
        passive: false,
      });
      document.addEventListener("mouseup", handleMouseUp);
      document.body.style.userSelect = "none"; // 防止选中文本

      return () => {
        document.removeEventListener("mousemove", handleMouseMove);
        document.removeEventListener("mouseup", handleMouseUp);
        document.body.style.userSelect = "";
      };
    }
  }, [isDragging, handleMouseMove, handleMouseUp]);

  // 添加消息
  const addMessage = useCallback(
    (role: "user" | "assistant", content: string, isStreaming = false, files?: UploadFile[]) => {
      const message: ChatMessage = {
        id: `${Date.now()}-${Math.random()}`,
        role,
        content,
        timestamp: Date.now(),
        isStreaming,
        files,
      };

      setMessages((prev) => [...prev, message]);

      if (!isVisible && role === "assistant") {
        setUnreadCount((prev) => prev + 1);
      }
    },
    [isVisible]
  );

  // 更新流式消息
  const updateStreamingMessage = useCallback(
    (messageId: string, content: string, isComplete = false) => {
      setMessages((prev) =>
        prev.map((msg) =>
          msg.id === messageId
            ? { ...msg, content, isStreaming: !isComplete }
            : msg
        )
      );
    },
    []
  );

  // 停止回复功能
  const stopResponse = useCallback(() => {
    if (abortControllerRef.current) {
      abortControllerRef.current.abort();
      setIsTyping(false);
      setCanStopResponse(false);
      message.info("已停止回复");
    }
  }, []);

  // AI分析功能
  const handleAIAnalysis = async (action: string) => {
    setCurrentAIAction(action);
    setAiModalLoading(true);
    setAiModalContent("");
    
    let title = "";
    let prompt = "";
    
    switch (userRole) {
      case "teacher":
        if (action === "teaching") {
          title = "教学建议分析";
          prompt = "请分析该教师的教学质量，包括教学方法、学生反馈、课程设计等方面，并提供具体的改进建议。";
        } else if (action === "learning") {
          title = "学情分析";
          prompt = "请分析该教师所教授班级的学习情况，包括学生成绩分布、学习难点、进步趋势等方面。";
        }
        break;
      case "student":
        if (action === "progress") {
          title = "学习进度分析";
          prompt = "请分析该学生的学习进度，包括各科目成绩、学习习惯、薄弱环节等方面，并提供学习建议。";
        } else if (action === "performance") {
          title = "学习表现分析";
          prompt = "请分析该学生的学习表现，包括课堂参与度、作业完成情况、考试表现等方面。";
        }
        break;
      case "admin":
        if (action === "system") {
          title = "系统运行分析";
          prompt = "请分析系统整体运行状况，包括用户活跃度、功能使用情况、系统性能等方面。";
        } else if (action === "management") {
          title = "管理建议分析";
          prompt = "请分析当前管理状况，包括用户管理、课程管理、系统配置等方面，并提供管理建议。";
        }
        break;
    }
    
    setAiModalTitle(title);
    setAiModalVisible(true);

    try {
      // 生成不同的分析文案模板
      const generateLearningAnalysis = () => {
        const analysisTemplates = [
          {
            intro: "根据您所教授班级的学习数据分析：",
            overall: "**整体表现：**\n- 班级平均分：78.5分\n- 及格率：92%\n- 优秀率：35%",
            distribution: "**学科分布：**\n- 理论课程：平均分75分\n- 实践课程：平均分82分\n- 综合能力：平均分80分",
            difficulties: [
              "**学习难点分析：**\n1. **抽象概念理解**：约30%的学生在复杂概念理解上存在困难\n2. **实践应用能力**：部分学生理论掌握较好，但实践应用能力有待提高\n3. **自主学习能力**：学生主动学习意识需要进一步培养",
              "**学习挑战识别：**\n1. **概念理解深度**：约30%的学生在抽象概念掌握上存在挑战\n2. **技能应用转化**：部分学生理论知识扎实，但实践应用能力需要加强\n3. **学习主动性**：学生的自主学习意识和能力需要进一步培养",
              "**学习困难分析：**\n1. **理论理解障碍**：约30%的学生在复杂理论概念理解上存在困难\n2. **实践能力短板**：部分学生理论掌握良好，但实践应用能力有待提升\n3. **学习习惯问题**：学生主动学习和自我管理能力需要进一步培养"
            ],
            suggestions: [
              "**改进建议：**\n1. 增加案例教学，帮助理解抽象概念\n2. 设计更多实践项目，提高应用能力\n3. 引导学生建立自主学习计划",
              "**优化策略：**\n1. 加强案例式教学，促进抽象概念理解\n2. 增加实践性项目，提升应用能力\n3. 培养自主学习习惯，建立学习计划",
              "**提升方案：**\n1. 采用案例教学法，辅助抽象概念理解\n2. 设计实践性项目，强化应用能力\n3. 指导自主学习，建立个人学习规划"
            ],
            trend: [
              "**发展趋势：**\n班级整体呈上升趋势，预计期末平均分可达82分。",
              "**发展预测：**\n班级整体表现呈稳步上升态势，预计期末平均分可达82分。",
              "**未来展望：**\n班级整体学习状态持续改善，预计期末平均分可达82分。"
            ]
          },
          {
            intro: "基于您班级的学习数据深度分析：",
            overall: "**整体表现：**\n- 班级平均分：78.5分\n- 及格率：92%\n- 优秀率：35%",
            distribution: "**学科分布：**\n- 理论课程：平均分75分\n- 实践课程：平均分82分\n- 综合能力：平均分80分",
            difficulties: [
              "**学习问题分析：**\n1. **概念理解困难**：约30%的学生在复杂概念理解上存在困难\n2. **应用能力不足**：部分学生理论掌握较好，但实践应用能力有待提高\n3. **学习主动性**：学生主动学习意识需要进一步培养",
              "**学习障碍识别：**\n1. **理论理解深度**：约30%的学生在抽象概念掌握上存在挑战\n2. **技能转化能力**：部分学生理论知识扎实，但实践应用能力需要加强\n3. **学习驱动力**：学生的自主学习意识和能力需要进一步培养",
              "**学习短板分析：**\n1. **概念掌握问题**：约30%的学生在复杂理论概念理解上存在困难\n2. **实践能力差距**：部分学生理论掌握良好，但实践应用能力有待提升\n3. **学习习惯培养**：学生主动学习和自我管理能力需要进一步培养"
            ],
            suggestions: [
              "**改进建议：**\n1. 增加案例教学，帮助理解抽象概念\n2. 设计更多实践项目，提高应用能力\n3. 引导学生建立自主学习计划",
              "**优化策略：**\n1. 加强案例式教学，促进抽象概念理解\n2. 增加实践性项目，提升应用能力\n3. 培养自主学习习惯，建立学习计划",
              "**提升方案：**\n1. 采用案例教学法，辅助抽象概念理解\n2. 设计实践性项目，强化应用能力\n3. 指导自主学习，建立个人学习规划"
            ],
            trend: [
              "**发展趋势：**\n班级整体呈上升趋势，预计期末平均分可达82分。",
              "**发展预测：**\n班级整体表现呈稳步上升态势，预计期末平均分可达82分。",
              "**未来展望：**\n班级整体学习状态持续改善，预计期末平均分可达82分。"
            ]
          },
          {
            intro: "通过深入分析您班级的学习数据发现：",
            overall: "**整体表现：**\n- 班级平均分：78.5分\n- 及格率：92%\n- 优秀率：35%",
            distribution: "**学科分布：**\n- 理论课程：平均分75分\n- 实践课程：平均分82分\n- 综合能力：平均分80分",
            difficulties: [
              "**学习难点分析：**\n1. **抽象概念理解**：约30%的学生在复杂概念理解上存在困难\n2. **实践应用能力**：部分学生理论掌握较好，但实践应用能力有待提高\n3. **自主学习能力**：学生主动学习意识需要进一步培养",
              "**学习挑战识别：**\n1. **概念理解深度**：约30%的学生在抽象概念掌握上存在挑战\n2. **技能应用转化**：部分学生理论知识扎实，但实践应用能力需要加强\n3. **学习主动性**：学生的自主学习意识和能力需要进一步培养",
              "**学习困难分析：**\n1. **理论理解障碍**：约30%的学生在复杂理论概念理解上存在困难\n2. **实践能力短板**：部分学生理论掌握良好，但实践应用能力有待提升\n3. **学习习惯问题**：学生主动学习和自我管理能力需要进一步培养"
            ],
            suggestions: [
              "**改进建议：**\n1. 增加案例教学，帮助理解抽象概念\n2. 设计更多实践项目，提高应用能力\n3. 引导学生建立自主学习计划",
              "**优化策略：**\n1. 加强案例式教学，促进抽象概念理解\n2. 增加实践性项目，提升应用能力\n3. 培养自主学习习惯，建立学习计划",
              "**提升方案：**\n1. 采用案例教学法，辅助抽象概念理解\n2. 设计实践性项目，强化应用能力\n3. 指导自主学习，建立个人学习规划"
            ],
            trend: [
              "**发展趋势：**\n班级整体呈上升趋势，预计期末平均分可达82分。",
              "**发展预测：**\n班级整体表现呈稳步上升态势，预计期末平均分可达82分。",
              "**未来展望：**\n班级整体学习状态持续改善，预计期末平均分可达82分。"
            ]
          }
        ];

        const template = analysisTemplates[Math.floor(Math.random() * analysisTemplates.length)];
        const difficultyIndex = Math.floor(Math.random() * template.difficulties.length);
        const suggestionIndex = Math.floor(Math.random() * template.suggestions.length);
        const trendIndex = Math.floor(Math.random() * template.trend.length);

        return [
          "正在分析班级学习情况...",
          `${template.intro}\n\n${template.overall}\n\n${template.distribution}`,
          `${template.intro}\n\n${template.overall}\n\n${template.distribution}\n\n${template.difficulties[difficultyIndex]}\n\n${template.suggestions[suggestionIndex]}\n\n${template.trend[trendIndex]}`
        ];
      };

      const mockResponses = {
        teacher: {
          teaching: [
            "正在分析您的教学质量数据...",
            "基于您最近的教学记录，我发现您在以下几个方面表现优秀：\n\n1. **教学方法创新性**：您经常使用多媒体教学和互动式教学，学生参与度较高。\n2. **课程设计合理性**：课程内容层次分明，难度递进合理。\n3. **学生反馈积极**：学生对您的教学满意度达到85%以上。",
            "基于您最近的教学记录，我发现您在以下几个方面表现优秀：\n\n1. **教学方法创新性**：您经常使用多媒体教学和互动式教学，学生参与度较高。\n2. **课程设计合理性**：课程内容层次分明，难度递进合理。\n3. **学生反馈积极**：学生对您的教学满意度达到85%以上。\n\n**改进建议：**\n\n1. **个性化教学**：建议根据学生不同学习能力，设计分层教学方案。\n2. **实践环节加强**：可以增加更多实践性作业和项目，提高学生动手能力。\n3. **反馈机制优化**：建立更及时的学生反馈收集机制，及时调整教学策略。\n4. **技术应用拓展**：可以尝试引入更多教育技术工具，如在线测验、虚拟实验室等。\n\n**预期效果：**\n实施这些建议后，预计学生成绩提升10-15%，学习积极性进一步提高。"
          ],
          learning: generateLearningAnalysis()
        },
        student: {
          progress: [
            "正在分析您的学习进度...",
            "根据您的学习记录分析：\n\n**当前进度：**\n- 已完成课程：12门\n- 进行中课程：3门\n- 平均成绩：85分\n- 学习时长：156小时\n\n**各科目表现：**\n- 数学：88分（优秀）\n- 英语：82分（良好）\n- 专业课程：87分（优秀）",
            "根据您的学习记录分析：\n\n**当前进度：**\n- 已完成课程：12门\n- 进行中课程：3门\n- 平均成绩：85分\n- 学习时长：156小时\n\n**各科目表现：**\n- 数学：88分（优秀）\n- 英语：82分（良好）\n- 专业课程：87分（优秀）\n\n**学习建议：**\n1. **英语提升**：建议每天增加30分钟英语学习时间，重点练习听力和口语\n2. **时间管理**：可以制定更详细的学习计划，提高学习效率\n3. **知识巩固**：定期复习已学内容，避免知识遗忘\n\n**目标设定：**\n建议设定期末平均分90分的目标，重点关注英语科目提升。"
          ],
          performance: [
            "正在分析您的学习表现...",
            "根据您的学习表现数据分析：\n\n**课堂参与度：**\n- 出勤率：95%\n- 课堂发言：每周平均3次\n- 小组活动参与：积极\n\n**作业完成情况：**\n- 按时完成率：98%\n- 作业质量：优秀\n- 创新性：良好",
            "根据您的学习表现数据分析：\n\n**课堂参与度：**\n- 出勤率：95%\n- 课堂发言：每周平均3次\n- 小组活动参与：积极\n\n**作业完成情况：**\n- 按时完成率：98%\n- 作业质量：优秀\n- 创新性：良好\n\n**考试表现：**\n- 期中考试：87分\n- 平时测验：平均85分\n- 综合评定：优秀\n\n**改进建议：**\n1. **发言质量**：可以准备更充分，提高发言的深度和广度\n2. **创新思维**：在作业中尝试更多创新性解决方案\n3. **团队协作**：在小组活动中发挥更多领导作用\n\n**发展潜力：**\n您具备优秀的学习能力，建议继续保持并进一步提升。"
          ]
        },
        admin: {
          system: [
            "正在分析系统运行状况...",
            "系统运行状况分析：\n\n**用户活跃度：**\n- 日活跃用户：1,250人\n- 月活跃用户：3,800人\n- 用户增长率：15%\n\n**功能使用情况：**\n- 最受欢迎功能：在线考试（45%）\n- 文件上传功能：使用率85%\n- AI助手使用：日使用量320次",
            "系统运行状况分析：\n\n**用户活跃度：**\n- 日活跃用户：1,250人\n- 月活跃用户：3,800人\n- 用户增长率：15%\n\n**功能使用情况：**\n- 最受欢迎功能：在线考试（45%）\n- 文件上传功能：使用率85%\n- AI助手使用：日使用量320次\n\n**系统性能：**\n- 平均响应时间：0.8秒\n- 系统稳定性：99.5%\n- 服务器负载：65%\n\n**优化建议：**\n1. **性能优化**：建议增加服务器资源，提高响应速度\n2. **功能推广**：加强对AI助手功能的宣传，提高使用率\n3. **用户体验**：优化移动端界面，提升用户体验\n\n**发展趋势：**\n系统使用量呈稳定增长趋势，建议持续优化。"
          ],
          management: [
            "正在分析管理状况...",
            "管理状况分析：\n\n**用户管理：**\n- 总用户数：5,200人\n- 教师：180人\n- 学生：4,800人\n- 管理员：220人\n\n**课程管理：**\n- 总课程数：156门\n- 活跃课程：142门\n- 课程完成率：78%",
            "管理状况分析：\n\n**用户管理：**\n- 总用户数：5,200人\n- 教师：180人\n- 学生：4,800人\n- 管理员：220人\n\n**课程管理：**\n- 总课程数：156门\n- 活跃课程：142门\n- 课程完成率：78%\n\n**系统配置：**\n- 安全策略：完善\n- 备份机制：每日自动备份\n- 监控系统：正常运行\n\n**管理建议：**\n1. **用户激励**：建立用户激励机制，提高活跃度\n2. **内容质量**：加强课程内容审核，提高教学质量\n3. **数据分析**：建立更完善的数据分析体系\n4. **安全防护**：定期更新安全策略，防范安全风险\n\n**预期效果：**\n实施这些建议后，预计用户活跃度提升20%，课程质量进一步提高。"
          ]
        }
      };
      
      const userResponses = mockResponses[userRole as keyof typeof mockResponses];
      const responses = (userResponses as any)?.[action] || [
        "正在分析数据...",
        "分析完成，正在生成报告...",
        "分析报告已生成，请查看详细内容。"
      ];
      
      for (let i = 0; i < responses.length; i++) {
        await new Promise(resolve => setTimeout(resolve, 1000 + i * 500));
        setAiModalContent(responses[i]);
      }
      
    } catch (error) {
      message.error("分析失败，请稍后重试");
    } finally {
      setAiModalLoading(false);
    }
  };

  // 重新生成AI分析
  const handleRegenerateAnalysis = () => {
    if (currentAIAction) {
      handleAIAnalysis(currentAIAction);
    }
  };

  // 获取角色特定的欢迎消息
  const getWelcomeMessage = (role: string) => {
    switch (role) {
      case "teacher":
        return "您好！我是您的AI教学助手 🤖\n\n我可以帮助您：\n• 📝 智能生成考试题目\n• 📊 深度分析学习数据\n• 📁 处理教学文件和图片\n• ❓ 解答教学相关问题\n• 💬 智能教学对话交流\n• 🎯 个性化教学建议\n• 📈 学情分析报告\n\n有什么需要帮助的吗？";
      case "student":
        return "您好！我是您的AI学习助手 🤖\n\n我可以帮助您：\n• 📚 智能学习资料整理\n• 📊 个人学习进度分析\n• 📁 处理学习文件和图片\n• ❓ 解答学习相关问题\n• 💬 智能学习对话交流\n• 🎯 个性化学习建议\n• 📈 学习表现分析\n\n有什么需要帮助的吗？";
      case "admin":
        return "您好！我是您的AI管理助手 🤖\n\n我可以帮助您：\n• 📊 系统运行数据分析\n• 👥 用户管理优化建议\n• 📁 处理管理文件和图片\n• ❓ 解答管理相关问题\n• 💬 智能管理对话交流\n• 🎯 系统优化建议\n• 📈 管理效能分析\n\n有什么需要帮助的吗？";
      default:
        return "您好！我是您的AI助手 🤖\n\n我可以帮助您：\n• 📝 智能生成考试题目\n• 📊 深度分析学习数据\n• 📁 处理文件和图片\n• ❓ 解答相关问题\n• 💬 智能对话交流\n\n有什么需要帮助的吗？";
    }
  };

  // 初始化欢迎消息
  useEffect(() => {
    if (!shouldDisable && messages.length === 0) {
      addMessage("assistant", getWelcomeMessage(userRole));
    }
  }, [shouldDisable, messages.length, addMessage, userRole]);

  // 自动滚动到底部
  useEffect(() => {
    if (messagesContainerRef.current) {
      const container = messagesContainerRef.current;
      container.scrollTop = container.scrollHeight;
    }
  }, [messages]);

  // 文件上传处理
  const handleFileUpload = async (file: UploadFile) => {
    try {
      const formData = new FormData();
      
      // 获取文件对象，支持多种格式
      let fileObj: File | null = null;
      
      if (file.originFileObj) {
        fileObj = file.originFileObj;
      } else if (file instanceof File) {
        fileObj = file;
      } else if (file.response?.data) {
        // 如果文件已经上传过，从response中获取
        fileObj = file.response.data;
      }
      
      if (!fileObj) {
        console.error('文件对象结构:', file);
        throw new Error('无法获取文件对象');
      }
      
      formData.append('file', fileObj);
      
      // 获取用户信息
      const userStr = localStorage.getItem('user');
      const user = userStr ? JSON.parse(userStr) : null;
      const userInfo = {
        account_id: user?.id?.toString() || "default_user",
        course_id: user?.currentCourseId?.toString() || "default_course"
      };

      console.log('上传文件:', file.name, '大小:', file.size, '类型:', file.type);
      console.log('文件对象:', fileObj);

      const response = await fetch(`http://localhost:8000/api/teach/upload?course_id=${userInfo.course_id}&file_id=${file.uid}`, {
        method: 'POST',
        // 不设置Content-Type，让浏览器自动设置multipart/form-data
        body: formData,
      });

      console.log('上传响应状态:', response.status);

      if (!response.ok) {
        const errorText = await response.text();
        console.error('上传失败响应:', errorText);
        throw new Error(`上传失败: ${response.status} - ${errorText}`);
      }

      const result = await response.json();
      console.log('上传响应结果:', result);
      
      if (result.code === 0) {  // 修复：后端返回code为0表示成功
        message.success(`${file.name} 上传成功`);
        return true;
      } else {
        throw new Error(result.msg || '上传失败');
      }
    } catch (error) {
      console.error('文件上传失败:', error);
      message.error(`${file.name} 上传失败: ${error instanceof Error ? error.message : '未知错误'}`);
      return false;
    }
  };

  // 发送消息 - 实现流式对话
  const sendMessage = async () => {
    if (!currentMessage.trim() || isTyping) return;

    const userMessage = currentMessage.trim();
    const currentFiles = [...uploadFiles]; // 复制当前文件列表
    setCurrentMessage("");
    setUploadFiles([]); // 清空文件列表
    addMessage("user", userMessage, false, currentFiles);

    // 中断之前的请求
    if (abortControllerRef.current) {
      abortControllerRef.current.abort();
    }

    setIsTyping(true);
    setCanStopResponse(true);
    const assistantMessageId = `assistant-${Date.now()}`;
    addMessage("assistant", "", true);

    try {
      // 创建新的 AbortController
      abortControllerRef.current = new AbortController();

      // 获取用户信息
      const userStr = localStorage.getItem('user');
      const user = userStr ? JSON.parse(userStr) : null;
      const userInfo = {
        account_id: user?.id?.toString() || "default_user",
        course_id: user?.currentCourseId?.toString() || "default_course"
      };

      // 构建请求体
      const requestBody: any = {
        message: userMessage,
      };

      // 如果有文件，添加文件信息
      if (currentFiles.length > 0) {
        requestBody.files = currentFiles.map((file) => ({
          name: file.name,
          type: file.type,
          uid: file.uid,
        }));
      }

      const response = await fetch(`http://localhost:8000/api/teach/chat?account_id=${userInfo.account_id}&course_id=${userInfo.course_id}`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(requestBody),
        signal: abortControllerRef.current.signal,
      });

      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }

      const reader = response.body?.getReader();
      if (!reader) {
        throw new Error("无法获取响应流");
      }

      let accumulatedContent = "";
      let buffer = "";
      const decoder = new TextDecoder();

      while (true) {
        const { done, value } = await reader.read();
        if (done) break;

        const chunk = decoder.decode(value, { stream: true });
        buffer += chunk;

        // 按行处理SSE数据
        const lines = buffer.split('\n');
        buffer = lines.pop() || ""; // 保留最后一个可能不完整的行

        for (const line of lines) {
          if (line.startsWith('data: ')) {
            try {
              const jsonStr = line.slice(6); // 移除 'data: ' 前缀
              if (jsonStr.trim() === '') continue;
              
              // 移除可能的尾部 ']'
              const cleanJsonStr = jsonStr.replace(/\]$/, '');
              const data = JSON.parse(cleanJsonStr);
              
              if (data.data && typeof data.data === 'string') {
                accumulatedContent += data.data;
              }
            } catch (e) {
              console.warn('解析SSE数据失败:', line, e);
            }
          }
        }

        // 更新最新的助手消息
        setMessages((prevMessages) => {
          const newMessages = [...prevMessages];
          const lastMessage = newMessages[newMessages.length - 1];
          if (lastMessage && lastMessage.role === "assistant") {
            lastMessage.content = accumulatedContent;
            lastMessage.isStreaming = accumulatedContent.length > 0;
          }
          return newMessages;
        });

        // 自动滚动到底部
        setTimeout(() => {
          messagesContainerRef.current?.scrollIntoView({ behavior: "smooth" });
        }, 10);
      }

      setIsTyping(false);
      setCanStopResponse(false);
    } catch (error: any) {
      console.error("发送消息失败:", error);
      setIsTyping(false);
      setCanStopResponse(false);

      if (error.name !== "AbortError") {
        // 添加错误消息
        addMessage("assistant", "抱歉，我遇到了一些问题，请稍后再试。");
        message.error("消息发送失败，请重试");
      }
    }
  };

  // 键盘事件处理
  const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
    if (e.key === "Enter" && !e.shiftKey) {
      e.preventDefault();
      sendMessage();
    }
  };

  // 文件上传配置
  const uploadProps: UploadProps = {
    name: "file",
    fileList: uploadFiles,
    beforeUpload: async (file) => {
      const isLt10M = file.size / 1024 / 1024 < 10;
      if (!isLt10M) {
        message.error("文件大小不能超过10MB!");
        return false;
      }

      // 检查文件类型
      const allowedTypes = [
        'image/jpeg', 'image/png', 'image/gif', 'image/webp',
        'application/pdf',
        'text/plain',
        'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        'application/msword',
        'text/markdown',
        'text/x-markdown'
      ];

      if (!allowedTypes.includes(file.type)) {
        message.error("不支持的文件类型！支持的类型：图片、PDF、TXT、Word、MD等");
        return false;
      }

      // 创建UploadFile对象
      const uploadFile: UploadFile = {
        uid: file.uid || `${Date.now()}-${Math.random()}`,
        name: file.name,
        status: 'uploading',
        originFileObj: file,
        size: file.size,
        type: file.type,
      };

      // 添加到文件列表
      setUploadFiles(prev => [...prev, uploadFile]);
      
      // 尝试上传文件
      const success = await handleFileUpload(uploadFile);
      if (!success) {
        // 如果上传失败，从列表中移除
        setUploadFiles(prev => prev.filter(f => f.uid !== uploadFile.uid));
        return false;
      }

      // 更新文件状态
      setUploadFiles(prev => prev.map(f => 
        f.uid === uploadFile.uid 
          ? { ...f, status: 'done' }
          : f
      ));

      return false; // 阻止默认上传行为
    },
    onRemove: (file) => {
      setUploadFiles(prev => prev.filter(f => f.uid !== file.uid));
      return true;
    },
    multiple: true,
    showUploadList: {
      showPreviewIcon: true,
      showRemoveIcon: true,
      showDownloadIcon: false,
    },
  };

  // 最大化/还原功能
  const toggleMaximize = () => {
    if (isMaximized) {
      setSize({ width: 380, height: 600 });
      setPosition({ x: 20, y: 20 });
      setIsMaximized(false);
    } else {
      setSize({
        width: Math.min(900, window.innerWidth - 40),
        height: Math.min(700, window.innerHeight - 40),
      });
      setPosition({ x: 20, y: 20 });
      setIsMaximized(true);
    }
  };

  // 格式化消息内容
  const formatMessage = (content: string) => {
    return content.split("\n").map((line, index) => (
      <React.Fragment key={index}>
        {line}
        {index < content.split("\n").length - 1 && <br />}
      </React.Fragment>
    ));
  };

  // 格式化时间
  const formatTime = (timestamp: number) => {
    return new Date(timestamp).toLocaleTimeString("zh-CN", {
      hour: "2-digit",
      minute: "2-digit",
    });
  };

  // 获取角色特定的快捷操作
  const getQuickActions = (role: string) => {
    switch (role) {
      case "teacher":
        return [
          {
            label: "教学建议",
            icon: <BookOutlined />,
            action: () => handleAIAnalysis("teaching"),
          },
          {
            label: "学情分析",
            icon: <BarChartOutlined />,
            action: () => handleAIAnalysis("learning"),
          },
        ];
      case "student":
        return [
          {
            label: "学习进度",
            icon: <TrophyOutlined />,
            action: () => handleAIAnalysis("progress"),
          },
          {
            label: "学习表现",
            icon: <UserOutlined />,
            action: () => handleAIAnalysis("performance"),
          },
        ];
      case "admin":
        return [
          {
            label: "系统分析",
            icon: <SettingOutlined />,
            action: () => handleAIAnalysis("system"),
          },
          {
            label: "管理建议",
            icon: <TeamOutlined />,
            action: () => handleAIAnalysis("management"),
          },
        ];
      default:
        return [
          {
            label: "生成试题",
            icon: <ThunderboltOutlined />,
            action: () => {
              setCurrentMessage("请帮我生成一些考试题目");
              setTimeout(sendMessage, 100);
            },
          },
          {
            label: "学习分析",
            icon: <FileImageOutlined />,
            action: () => {
              setCurrentMessage("请帮我分析学生的学习情况");
              setTimeout(sendMessage, 100);
            },
          },
        ];
    }
  };

  const quickActions = getQuickActions(userRole);

  if (shouldDisable) {
    return null;
  }

  if (!isVisible) {
    return (
      <div className={`digital-assistant-container ${className || ""}`}>
        <div className="floating-assistant">
          <Badge count={unreadCount} offset={[-8, 8]}>
            <div
              className="assistant-avatar"
              onClick={() => {
                setIsVisible(true);
                setUnreadCount(0);
              }}
            >
              <div className="avatar-pulse">
                <Avatar
                  size={60}
                  className="assistant-avatar-img"
                  icon={<div className="avatar-icon">🤖</div>}
                />
              </div>
            </div>
          </Badge>
          <Button
            type="primary"
            className="chat-bubble-btn"
            onClick={() => {
              setIsVisible(true);
              setUnreadCount(0);
            }}
            icon={<MessageOutlined />}
          >
            AI助手
          </Button>
        </div>
      </div>
    );
  }

  // 如果被禁用，显示考试模式警告
  if (shouldDisable) {
    return (
      <div className={`digital-assistant-container ${className || ""}`}>
        <div
          ref={chatContainerRef}
          className="chat-container exam-mode"
          style={{
            position: "fixed",
            left: position.x,
            top: position.y,
            width: size.width,
            height: "auto",
            zIndex: 9999,
            transition: "all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
          }}
        >
          <div className="chat-header drag-handle" onMouseDown={handleMouseDown}>
            <div className="avatar-section">
              <Badge status="error" dot>
                <Avatar
                  size={40}
                  icon={<span style={{ fontSize: "20px" }}>🚫</span>}
                />
              </Badge>
              <div className="title-section">
                <h4>AI助手已禁用</h4>
                <span className="status" style={{ color: "#ff4d4f" }}>
                  考试模式
                </span>
              </div>
            </div>
            <div className="actions">
              <Button
                type="text"
                size="small"
                icon={<CloseOutlined />}
                onClick={() => setIsVisible(false)}
                title="关闭"
              />
            </div>
          </div>
          <div className="chat-body">
            <div className="exam-warning">
              <Alert
                message="考试模式"
                description="考试期间AI助手已被禁用，请专注于答题。考试结束后将自动恢复。"
                type="warning"
                showIcon
                icon={<ExclamationCircleOutlined />}
                style={{ margin: "16px" }}
              />
            </div>
          </div>
        </div>
      </div>
    );
  }

  return (
    <div className={`digital-assistant-container ${className || ""}`}>
      <div
        ref={chatContainerRef}
        className={`chat-container ${isMinimized ? "minimized" : ""} ${
          isDragging ? "dragging" : ""
        } ${isMaximized ? "maximized" : ""}`}
        style={{
          position: "fixed",
          left: position.x,
          top: position.y,
          width: size.width,
          height: isMinimized ? "auto" : size.height,
          zIndex: 9999,
          transition: isDragging
            ? "none"
            : "all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
        }}
      >
        {/* 头部 */}
        <div
          className="chat-header drag-handle"
          onMouseDown={handleMouseDown}
          style={{ cursor: isMaximized ? "default" : "grab" }}
        >
          <div className="avatar-section">
            <Badge status="success" dot>
              <Avatar
                size={40}
                icon={<span style={{ fontSize: "20px" }}>🤖</span>}
              />
            </Badge>
            <div className="title-section">
              <h4>
                {userRole === "teacher" ? "AI教学助手" : 
                 userRole === "student" ? "AI学习助手" : 
                 userRole === "admin" ? "AI管理助手" : "AI助手"}
              </h4>
              <span className="status">
                {isTyping ? "正在思考..." : "在线"}
              </span>
            </div>
          </div>

          <div className="actions">
            {!isMaximized && (
              <Button
                type="text"
                size="small"
                icon={<DragOutlined />}
                title="拖拽移动"
                className="drag-handle"
                style={{ cursor: "grab" }}
              />
            )}
            <Button
              type="text"
              size="small"
              icon={isMaximized ? <CompressOutlined /> : <ExpandOutlined />}
              onClick={toggleMaximize}
              title={isMaximized ? "还原" : "最大化"}
            />
            <Button
              type="text"
              size="small"
              icon={isMinimized ? <MessageOutlined /> : <MinusOutlined />}
              onClick={() => setIsMinimized(!isMinimized)}
              title={isMinimized ? "展开" : "最小化"}
            />
            <Button
              type="text"
              size="small"
              icon={<CloseOutlined />}
              onClick={() => setIsVisible(false)}
              title="关闭"
            />
          </div>
        </div>

        {/* 消息区域 */}
        {!isMinimized && (
          <div className="chat-body">
            <div
              className="messages-container"
              ref={messagesContainerRef}
              style={{ height: size.height - 200 }}
            >
              {messages.map((message) => (
                <div key={message.id} className={`message ${message.role}`}>
                  <div className="message-avatar">
                    <Avatar
                      size={32}
                      icon={
                        message.role === "user" ? (
                          <span style={{ fontSize: "16px" }}>👤</span>
                        ) : (
                          <span style={{ fontSize: "16px" }}>🤖</span>
                        )
                      }
                    />
                  </div>
                  <div className="message-content">
                    {/* 显示文件信息 */}
                    {message.files && message.files.length > 0 && (
                      <div className="message-files">
                        {message.files.map((file) => (
                          <div key={file.uid} className="file-item">
                            <PaperClipOutlined />
                            <span>{file.name}</span>
                          </div>
                        ))}
                      </div>
                    )}
                    <div className="message-text">
                      {formatMessage(message.content)}
                      {message.isStreaming && (
                        <span className="typing-indicator">
                          <span className="dot"></span>
                          <span className="dot"></span>
                          <span className="dot"></span>
                        </span>
                      )}
                    </div>
                    <div className="message-time">
                      {formatTime(message.timestamp)}
                    </div>
                  </div>
                </div>
              ))}
            </div>

            {/* 文件上传区域 */}
            {uploadFiles.length > 0 && (
              <div className="upload-area">
                <Upload {...uploadProps} />
              </div>
            )}

            {/* 快捷操作按钮 */}
            <div className="quick-actions">
              {quickActions.map((action, index) => (
                <Button
                  key={index}
                  size="small"
                  icon={action.icon}
                  onClick={action.action}
                  disabled={isTyping}
                >
                  {action.label}
                </Button>
              ))}
              <Upload {...uploadProps} showUploadList={false}>
                <Button
                  size="small"
                  icon={<UploadOutlined />}
                  disabled={isTyping}
                >
                  上传文件
                </Button>
              </Upload>
            </div>

            {/* 输入区域 */}
            <div className="chat-input">
              <div className="input-container">
                <TextArea
                  ref={messageInputRef}
                  value={currentMessage}
                  onChange={(e) => setCurrentMessage(e.target.value)}
                  onKeyDown={handleKeyDown}
                  placeholder="请输入您的问题... (Shift+Enter换行)"
                  autoSize={{ minRows: 1, maxRows: 4 }}
                  disabled={isTyping}
                  className="message-input"
                />
                <div className="input-actions">
                  {canStopResponse && (
                    <Button
                      type="default"
                      icon={<StopOutlined />}
                      onClick={stopResponse}
                      className="stop-btn"
                      title="停止回复"
                    />
                  )}
                <Button
                  type="primary"
                  icon={isTyping ? <LoadingOutlined /> : <SendOutlined />}
                  onClick={sendMessage}
                  disabled={!currentMessage.trim() || isTyping}
                  className="send-btn"
                  loading={isTyping}
                />
                </div>
              </div>
            </div>
          </div>
        )}
      </div>

      {/* AI分析模态框 */}
      <Modal
        title={aiModalTitle}
        open={aiModalVisible}
        onCancel={() => setAiModalVisible(false)}
        footer={[
          <Button key="close" onClick={() => setAiModalVisible(false)}>
            关闭
          </Button>,
          <Button
            key="regenerate"
            type="primary"
            icon={<ThunderboltOutlined />}
            loading={aiModalLoading}
            onClick={handleRegenerateAnalysis}
          >
            重新分析
          </Button>,
        ]}
        width={800}
        destroyOnClose
      >
        <div style={{ minHeight: "400px", position: "relative" }}>
          {aiModalLoading && (
            <div
              style={{
                position: "absolute",
                top: 0,
                left: 0,
                right: 0,
                bottom: 0,
                background: "rgba(255, 255, 255, 0.8)",
                display: "flex",
                alignItems: "center",
                justifyContent: "center",
                zIndex: 1,
              }}
            >
              <Spin size="large" tip="AI正在分析中..." />
            </div>
          )}
          <Typography.Paragraph
            style={{
              whiteSpace: "pre-wrap",
              lineHeight: "1.6",
              fontSize: "14px",
              margin: 0,
            }}
          >
            {aiModalContent || "正在准备分析..."}
          </Typography.Paragraph>
        </div>
      </Modal>
    </div>
  );
};

export default DigitalAssistant;
